/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CapaNegocios;
import entidad.Ordenentrada;
import controlador.OrdenentradaJpaController;
import controlrestaurante.pmf;
import java.util.Date;
import entidad.Proveedores;
import entidad.Lotes;
import controlador.LotesJpaController;
import controlador.ProductoJpaController;
import entidad.Producto;
import java.beans.Statement;
import java.util.List;
import javax.persistence.EntityTransaction;
import java.util.Calendar;
import javax.persistence.Query;
import sun.security.action.GetBooleanSecurityPropertyAction;
/**
 *
 * @author a
 */
public class CNOrdenEntrada {
    //******Funciones insertar**********
    private static boolean insertar(Ordenentrada orden)
    {        
        try{
            OrdenentradaJpaController controlador = new OrdenentradaJpaController(pmf.getInstancia().getEMF());
            controlador.create(orden);
        }catch (Exception e){
            return false;
        }
        return true;  
    }
    
    private static boolean aumentarProducto(Producto p, Lotes l)
    {        
        try{
                p.setCanitdad(p.getCanitdad()+l.getCantidad());

            if(p.getPrecio()<=0)
                p.setPrecio(l.getPrecioUnitario());
            else
                p.setPrecio((p.getPrecio()+
                        l.getPrecioUnitario())/2);            
        }
        catch(Exception e)
        {
            return false;
        }
        return CNProducto.modificar(p);
    }
    
    private static boolean descontarProductos(Producto p , Lotes l)
    {
        try
        {
            p.setCanitdad(p.getCanitdad()-l.getCantidad());
            if(p.getPrecio()<=0)
                p.setPrecio(l.getPrecioUnitario());
            else
            {
                p.setPrecio((p.getPrecio()-
                    l.getPrecioUnitario())*2);
                if(p.getPrecio()<0)
                    p.setPrecio(p.getPrecio()*-1);
            }
        }
        catch(Exception e)
        {
            return false;
        }
        return (CNProducto.modificar(p));
    }
    
    public static boolean insertar(Date fecha, float total, String noFactura,List<Lotes> lotes,int provedor)
    {
        Proveedores pro = CNProveedor.buscarId(provedor);
        Ordenentrada orden = new Ordenentrada();
        orden.setFecha(fecha);
        orden.setTotal(total);
        orden.setNoFactura(noFactura);
        orden.setProveedoridProveedor(pro);
        orden.setActivo(Boolean.TRUE);
        EntityTransaction txt = pmf.getInstancia().getEMF().createEntityManager().getTransaction();
        txt.begin();
        boolean i = insertar(orden);
        if(!i)
        {
            txt.rollback();
            return i;
        }
        for (Lotes l: lotes)
        {
            try
            {
                l.setOrdenEntradaidOrdenEntrada(orden);
                l.setFechaDeIngreso(Calendar.getInstance().getTime());
                LotesJpaController controladorLote = new LotesJpaController(pmf.getInstancia().getEMF());
                controladorLote.create(l);
                orden.getLotesCollection().add(l);
                l.getProductoidProducto().setCanitdad(l.getProductoidProducto().getCanitdad()+l.getCantidad());
                if(l.getProductoidProducto().getPrecio()<=0)
                    l.getProductoidProducto().setPrecio(l.getPrecioUnitario());
                else
                    l.getProductoidProducto().setPrecio((l.getProductoidProducto().getPrecio()+
                            l.getPrecioUnitario())/2);
                CNProducto.modificar(l.getProductoidProducto());
            }
            catch (Exception e)
            {
                txt.rollback();
                return false;
            }
        }
        i = modificar(orden);
        if(!i)
        {
            txt.rollback();
            return i;
        }
        txt.commit();
        return i;
    }
    public static boolean insertar(Date fecha, float total, String noFactura,List<Lotes> lotes)
    {        
        Ordenentrada orden = new Ordenentrada();
        orden.setFecha(fecha);
        orden.setTotal(total);
        orden.setNoFactura(noFactura); 
        orden.setActivo(Boolean.TRUE);
        boolean i = insertar(orden);
        for (Lotes l: lotes)
        {
            try
            {
                l.setOrdenEntradaidOrdenEntrada(orden);
                LotesJpaController controladorLote = new LotesJpaController(pmf.getInstancia().getEMF());
                controladorLote.create(l);
                orden.getLotesCollection().add(l);
                if(aumentarProducto(l.getProductoidProducto(), l)==false)
                    return false;
            }
            catch (Exception e)
            {
                return false;
            }
        }
        i = modificar(orden);
        return i;             
    }
    
     //******Funciones eliminar**********
    public static boolean eliminar(Ordenentrada orden)
    {
        try{
            OrdenentradaJpaController controlador = new OrdenentradaJpaController(pmf.getInstancia().getEMF()); 
            LotesJpaController controladorLote = new LotesJpaController(pmf.getInstancia().getEMF());
            for(Lotes l : orden.getLotesCollection())
                {
                    try
                    {
                        if(descontarProductos(l.getProductoidProducto(), l)==false)
                            return false;
                        l.setOrdenEntradaidOrdenEntrada(orden);                        
                        controladorLote.destroy(l.getIdLotes());
                    }
                    catch (Exception e)
                    {
                        return false;
                    }
                }
            controlador.destroy(orden.getIdOrdenEntrada());
        }catch (Exception e){
            return false;
        }
        return true;    
    }
    
     //******Funciones insertar**********
    public static boolean modificar(Ordenentrada orden)
    {
        try{
            OrdenentradaJpaController controlador = new OrdenentradaJpaController(pmf.getInstancia().getEMF());            
            controlador.edit(orden);
        }catch (Exception e){
            return false;
        }
        return true;    
    }
    
    public static boolean modificar(Ordenentrada orden,List<Lotes> listaEliminados)
    {
        try{
            OrdenentradaJpaController controlador = new OrdenentradaJpaController(pmf.getInstancia().getEMF());
            LotesJpaController controladorLote = new LotesJpaController(pmf.getInstancia().getEMF());
            if(!listaEliminados.isEmpty())
            {
                for(Lotes l : listaEliminados)
                {
                    try
                    {
                        if(descontarProductos(l.getProductoidProducto(), l)==false)
                            return false;
                        l.setOrdenEntradaidOrdenEntrada(orden);                        
                        controladorLote.destroy(l.getIdLotes());
                    }
                    catch (Exception e)
                    {
                        return false;
                    }
                }
            }
            for(Lotes l : orden.getLotesCollection())
                if(l.getIdLotes()==0)
                {
                    try
                    {
                        if(aumentarProducto(l.getProductoidProducto(), l)==false)
                            return false;
                        l.setOrdenEntradaidOrdenEntrada(orden);
                        controladorLote.create(l);
                    }
                    catch (Exception e)
                    {
                        return false;
                    }
                }
            controlador.edit(orden);
        }catch (Exception e){
            return false;
        }
        return true;    
    }
    
    public static List<Ordenentrada> buscarFactura(String factura)  
    {
        List <Ordenentrada> lista = null ;
        try{
           lista = (List) Consultas.consulta("Ordenentrada", "findByNoFactura", "noFactura", "%"+factura+"%"); 
        }
        catch(Exception e)
        {
            return null;
        }
        
        return lista;
    }
    
    public static List<Ordenentrada> buscarFecha(Date date)  
    {
        List <Ordenentrada> lista = null ;
        try{
           lista = (List) Consultas.consulta("Ordenentrada", "findByFecha", "fecha", date); 
        }
        catch(Exception e)
        {
            return null;
        }
        
        return lista;
    }
    
    public static List<Ordenentrada> buscarNombre(String nombre)  
    {
        List <Ordenentrada> lista = null ;
        try{
           String qu = "SELECT  a FROM Ordenentrada a  JOIN a.proveedoridProveedor p" 
            + " WHERE p.nombre like :nombre" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("nombre", "%"+nombre+"%");
           lista = (List<Ordenentrada>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        
        return lista;
    }
    
    public static List<Ordenentrada> buscarNombreFactura(String nombre, String factura)  
    {
        List <Ordenentrada> lista = null ;
        try{
           String qu = "SELECT  a FROM Ordenentrada a  JOIN a.proveedoridProveedor p" 
            + " WHERE (p.nombre like :nombre )and (a.noFactura like :noFactura)" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("nombre", "%"+nombre+"%");
           quer.setParameter("noFactura", "%"+factura+"%");
           lista = (List<Ordenentrada>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        
        return lista;
    }
    
    public static List<Ordenentrada> buscarNombreFecha(String nombre, Date fecha)  
    {
        List <Ordenentrada> lista = null ;
        try{
           String qu = "SELECT  a FROM Ordenentrada a  JOIN a.proveedoridProveedor p" 
            + " WHERE p.nombre like :nombre and a.fecha = :fecha" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("nombre", "%"+nombre+"%");
           quer.setParameter("fecha", fecha);
           lista = (List<Ordenentrada>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        
        return lista;
    }
    
    public static List<Ordenentrada> buscarFacturaFecha(String factura, Date fecha)  
    {
        List <Ordenentrada> lista = null ;
        try{
           String qu = "SELECT  a FROM Ordenentrada a " 
            + " WHERE a.noFactura like :noFactura AND a.fecha = :fecha" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("noFactura", "%"+factura+"%");
           quer.setParameter("fecha", fecha);
           lista = (List<Ordenentrada>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        
        return lista;
    }
    
    public static List<Ordenentrada> buscarNombreFechaFactura(String nombre, Date fecha,String noFactura)  
    {
        List <Ordenentrada> lista = null ;
        try{
           String qu = "SELECT  a FROM Ordenentrada a  JOIN a.proveedoridProveedor p" 
            + " WHERE (p.nombre like :nombre ) and (a.noFactura like :noFactura and a.fecha = :fecha)" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("nombre", "%"+nombre+"%");
           quer.setParameter("fecha", fecha);
           quer.setParameter("noFactura", "%"+noFactura+"%");
           lista = (List<Ordenentrada>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        
        return lista;
    }
}
